home *** CD-ROM | disk | FTP | other *** search
- {
- >Do you have Pascal code For generating this PLAsmA fractal? if so,
- >then I'd like to snarf a copy of it, if'n you don't mind... Or (if it's
- >not too large) could you post it as a message? Thanx in advance!
- }
-
- Program PlAsma;
-
- Uses
- Crt, Dos;
-
- Const
- f = 2.0;
- EndProgram : Boolean = False;
- DelayFactor : Byte = 20;
-
- Type
- ColorValue = Record
- Rvalue,
- Gvalue,
- Bvalue : Byte;
- end;
-
- PaletteType = Array [0..255] of ColorValue;
-
- Var
- ch : Char;
- i : Integer;
- image : File;
- ok : Boolean;
- p : paletteType;
-
- Procedure SetVGApalette(Var tp : PaletteType);
- Var
- regs : Registers;
- begin
- With regs do
- begin
- AX := $1012;
- BX := 0;
- CX := 256;
- ES := Seg(tp);
- DX := Ofs(tp);
- end;
- Intr($10, regs);
- end;
-
- Procedure PutPixel(x, y : Integer; c : Byte);
- begin
- mem[$a000 : Word(320 * y + x)] := c;
- end;
-
- Function GetPixel(x, y : Integer) : Byte;
- begin
- GetPixel := mem[$a000 : Word(320 * y + x)];
- end;
-
- Procedure adjust(xa, ya, x, y, xb, yb : Integer);
- Var
- d, v : Integer;
- begin
- if GetPixel(x, y) <> 0 then
- Exit;
- d := abs(xa - xb) + abs(ya - yb);
- v := trunc((GetPixel(xa, ya) + GetPixel(xb, yb)) / 2 +
- (random - 0.5) * d * F);
- if v < 1 then
- v := 1;
- if v >= 193 then
- v := 192;
- putpixel(x, y, v);
- end;
-
- Procedure subDivide(x1, y1, x2, y2 : Integer);
- Var
- x, y : Integer;
- v : Real;
- begin
- if KeyPressed then
- Exit;
- if (x2 - x1 < 2) and (y2 - y1 < 2) then
- Exit;
- x := (x1 + x2) div 2;
- y := (y1 + y2) div 2;
- adjust(x1, y1, x, y1, x2, y1);
- adjust(x2, y1, x2, y, x2, y2);
- adjust(x1, y2, x, y2, x2, y2);
- adjust(x1, y1, x1, y, x1, y2);
- if GetPixel(x, y) = 0 then
- begin
- v := (GetPixel(x1, y1) + GetPixel(x2, y1) + GetPixel(x2, y2) +
- getPixel(x1, y2)) / 4;
- putpixel(x, y, Trunc(v));
- end;
-
- SubDivide(x1, y1, x, y);
- subDivide(x, y1, x2, y);
- subDivide(x, y, x2, y2);
- subDivide(x1, y, x, y2);
- end;
-
- Procedure rotatePalette(Var p : PaletteType; n1, n2, d : Integer);
- Var
- q : PaletteType;
- begin
- q := p;
- For i := n1 to n2 do
- p[i] :=q[n1 + (i + d) mod (n2 - n1 + 1)];
- SetVGApalette(p);
- end;
-
- begin
- Inline($b8/$13/0/$cd/$10);
- With P[0] do
- begin
- Rvalue := 32;
- Gvalue := 32;
- Bvalue := 32;
- end;
- For i := 0 to 63 do
- begin
- With p[i + 1] do
- begin
- Rvalue := 63-i; { 63 - i }
- Gvalue := 63-i; { 63 - i }
- Bvalue := i+63; { 0 }
- end;
- With p[i + 65] do
- begin
- Rvalue := 0; { 0 }
- Gvalue := i+63; { i }
- Bvalue := 63-i; { 0 }
- end;
- With p[i + 129] do
- begin
- Rvalue := i; { 0 }
- Gvalue := i; { 0 }
- Bvalue := 63 - i; { 63 - i }
- end;
- end;
- Inline($b8/$13/0/$cd/$10);
-
- SetVGApalette(p);
- Assign(image, 'PLASMA.IMG');
- {$i-}
- Reset(image, 1);
- {$I+}
- ok := (ioResult = 0);
- if not ok or (ParamCount <> 0) then
- begin
- Randomize;
- putpixel(0, 0, 1 + Random(192));
- putpixel(319, 0, 1 + Random(192));
- putpixel(319, 199, 1 + Random(192));
- putpixel(0, 199, 1 + Random(192));
- SubDivide(0, 0, 319, 199);
- ReWrite(image, 1);
- BlockWrite(image, mem[$a000:0], $FA00);
- end
- else
- BlockRead(image, mem[$a000:0], $FA00);
-
- Close(image);
- Repeat
- rotatePalette(p, 1, 192, + 1);
- Delay(DelayFactor);
- If KeyPressed then
- Case ReadKey of
- #0 : Case ReadKey of
- #80 : If DelayFactor < 255 then
- Inc(DelayFactor);
- #72 : If DelayFactor > 0 then
- Dec(DelayFactor);
- end;
- #113,#81 {Q,q} : EndProgram := True;
- end;
- Until EndProgram;
-
- TextMode(lastmode);
- end.